TypeScript 61.9%
HTML 37.2%
SQL 0.7%
1import type { Metadata } from 'next';2import Link from 'next/link';3import { notFound } from 'next/navigation';4import { requireUser } from '@/lib/auth/session';5import { getCollection } from '@/lib/account/queries';6import { PageHeader, btnSecondary } from '@/components/account/page-header';7import { Card, CardHeader } from '@/components/ui/primitives';8import { ImportForm } from './import-form';910export const metadata: Metadata = { title: 'Import CSV', robots: { index: false } };1112const TEMPLATE = 'asset_id,asset_slug,quantity,acquired_at,purchase_price,currency,grader,grade,cert,serial,source,condition,notes,tags\n,1999-base-set-charizard-4-102-1st-edition,1,2021-05-14,3200,USD,psa,10,12345678,,eBay,,bought from a friend,grail|sealed\n';1314export default async function ImportPage({ params }: { params: Promise<{ id: string }> }) {15 const { id } = await params;16 const u = await requireUser(`/collections/${id}/import`);17 const col = await getCollection(u.id, id);18 if (!col) notFound();19 return (20 <>21 <nav className="mb-2 text-xs text-muted">22 <Link href={`/collections/${id}`} className="hover:text-fg">23 {col.name}24 </Link>{' '}25 / <span className="text-fg">Import</span>26 </nav>27 <PageHeader title="Import items from CSV" description="Up to 500 rows per file. Each row needs an asset_id (rare_…) or asset_slug from RareIndex; unknown assets are skipped and reported." actions={<a href={`data:text/csv;charset=utf-8,${encodeURIComponent(TEMPLATE)}`} download="rareindex-import-template.csv" className={btnSecondary}>Download template</a>} />28 <div className="grid gap-4 lg:grid-cols-[minmax(0,1fr)_320px]">29 <Card>30 <CardHeader title="Upload" />31 <div className="p-4">32 <ImportForm collectionId={id} />33 </div>34 </Card>35 <Card>36 <CardHeader title="Columns" />37 <ul className="space-y-1 p-4 text-xs text-muted">38 <li>39 <code>asset_id</code> or <code>asset_slug</code> — required40 </li>41 <li>42 <code>quantity</code> — default 143 </li>44 <li>45 <code>acquired_at</code> — YYYY-MM-DD46 </li>47 <li>48 <code>purchase_price</code>, <code>currency</code> — per unit, converted at acquisition-date FX49 </li>50 <li>51 <code>grader</code>, <code>grade</code>, <code>cert</code>, <code>serial</code>52 </li>53 <li>54 <code>source</code>, <code>condition</code>, <code>notes</code>55 </li>56 <li>57 <code>tags</code> — separated by <code>|</code> or commas58 </li>59 </ul>60 </Card>61 </div>62 </>63 );64}65